Skip to main content

16 P2P协议

FTP 的两种工作模式

主动模式(PORT):

客户端随机打开一个大于 1024 的端口 N,向服务器的命令端口 21 发起连接,同时开放 N+1 端口监听,并向服务器发出 “port N+1” 命令,由服务器从自己的数据端口 20,主动连接到客户端指定的数据端口 N+1。

被动模式(PASV):

当开启一个 FTP 连接时,客户端打开两个任意的本地端口 N(大于 1024)和 N+1。第一个端口连接服务器的 21 端口,提交 PASV 命令。然后,服务器会开启一个任意的端口 P(大于 1024),返回“227 entering passive mode”消息,里面有 FTP 服务器开放的用来进行数据传输的端口。客户端收到消息取得端口号之后,会通过 N+1 号端口连接服务器的端口 P,然后在两个端口之间进行数据传输。

单一服务器的带宽压力大。

P2P

P2P (peer-to-peer):资源开始并不集中地存储在某些设备上,而是分散地存储在多台设备上。

下载个文件时,得到已经存在了文件的 peer,和这些 peer 之间建立点对点的连接,不需要到中心服务器上,就可以就近下载文件。下载了文件后自身也成为 peer 中的一员,其他下载者也可能会选择从自身这里下载文件。 BitTorrent 里既有下载流量,也有上传的流量,参与的人越多,下载速度越快。

种子(.torrent)文件

announce(tracker URL)

文件信息:

  • info 区:指定该种子有几个文件、文件有多长、目录结构,以及目录和文件的名字。
  • Name 字段:指定顶层目录名字。
  • 每个段的大小:BitTorrent(简称 BT)协议把一个文件分成很多个小段,然后分段下载。
  • 段哈希值:将整个种子中,每个段的 SHA-1 哈希值拼在一起。

下载时,BT 客户端首先解析.torrent 文件,得到 tracker 地址,然后连接 tracker 服务器。tracker 服务器回应下载者的请求,将其他下载者(包括发布者)的 IP 提供给下载者。下载者再连接其他下载者,根据.torrent 文件,两者分别对方告知自己已经有的块,然后交换对方没有的数据。此时不需要其他服务器参与,并分散了单个线路上的数据流量,因此减轻了服务器的负担。

去中心化网络(DHT)

每个加入这个 DHT 网络的人,都要负责存储这个网络里的资源信息和其他成员的联系信息,相当于所有人一起构成了一个庞大的分布式存储数据库。

Kademlia 协议

任何一个 BitTorrent 启动之后,它都有两个角色。一个是 peer,监听一个 TCP 端口,用来上传和下载文件,这个角色表明,我这里有某个文件。另一个角色 DHT node,监听一个 UDP 的端口,通过这个角色,这个节点加入了一个 DHT 的网络。

哈希值

每个文件可以计算出一个哈希值,DHT node 的 ID 是和哈希值相同长度的串。

DHT 网络维护

DHT 网络按距离分层。

DHT 网络查找